<?php
require_once 'include/config.php';
class SitemapGenerator {

    //Nombre d'urls maximum par fichier
    private $_maxUrlsPerFile = 50000;
    //Nombre d'urls ajoutés au sitemap
    private $_totalUrls = 0;
    //L'url de base du site web
    private $_rootUrl = "";
    //Le chemin où l'on va enregistrer notre sitemap
    private $_savePath = "";
    //Contient notre objet XmlWriter
    private $_xml;
    //Fichier sitemap en cours d'utilisation
    private $_file;
    //Stocke dans un tableau toutes les urls qu'on veut enregistrer
    private $_urls = array();

    public function __construct($rootUrl = "") {
        //On définit l'url de base de notre site web
        $this->_rootUrl = !empty($rootUrl) ? $rootUrl : 'http://' . $_SERVER['SERVER_NAME'];
    }

    //Un setter pour pouvoir modifier l'attribut savePath
    public function setSavePath($savePath) {
        $this->_savePath = $savePath;
    }

    private function _newSitemapFile() {
        //On definie notre variable
        $fileNbr = "";
        //Si le nombre d'urls est supérieur a 0, on détermine le nom du fichier
        if ($this->_totalUrls > 0)
            $fileNbr = intval($this->_totalUrls / $this->_maxUrlsPerFile + 1);
        //Si le nombre est supérieur à 1, on l'utilise dans le nom du fichier sinon on laisse vide
        $fileNbr = $fileNbr > 1 ? $fileNbr : "";
        //On définit le nom du fichier
        $filename = $this->_savePath . 'sitemap' . $fileNbr . '.xml';
        //On récupère le répertoire
        $dirname = dirname($filename);
        //On vérifie si le répertoire existe
        if (!is_dir($dirname)) {
            //Sinon on crée le répertoire
            mkdir($dirname, 0755, true);
        }
        //Et on crée le fichier
        $this->_file = fopen($filename, "w");

        //On instancie XmlWriter
        $this->_xml = new XmlWriter();
        //On utilise la mémoire pour l'affichage 
        $this->_xml->openMemory();
        //On active l'indentation
        $this->_xml->setIndent(TRUE);
        //On définit comment sera indenté chaque élément, ici deux espaces
        $this->_xml->setIndentString('  ');
        //On commence un nouveau document en indiquant la version ici 1.0 et l'encodage
        $this->_xml->startDocument('1.0', 'UTF-8');
        //On crée un nouvel élément, comme on l'a vu un sitemap commence toujours par un urlset.
        $this->_xml->startElement("urlset");
        //Qui possède un attribut xmlns
        $this->_xml->writeAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");
    }

    //L'url, la dernière modification, la fréquence à laquelle la page est modifiée 
    //et pour finir l'importance de cette page par rapport au-autre.
    public function addUrl($url, $lastmod = "", $freq = "", $prio = "") {
        //On vérifie si l'url commence par un / sinon on l'ajoute
        $url = $url[0] === '/' ? $url : '/' . $url;

        //On vérifie si la dernière date de modification n'est pas vide 
        //et si elle est au bon format année-mois-jour
        if ($lastmod != "" AND preg_match('`^[0-9]{4}\-[0-1][0-9]\-[0-3][0-9]$`i', $lastmod)) {
            //On sépare les jours, mois et année au niveau des tirets
            $date = $date = explode('-', $lastmod);
            //On vérifie si la date existe, si oui on l'utilise et sinon on la vide
            $lastmod = checkdate($date[1], $date[2], $date[0]) ? $lastmod : "";
        } else {
            //Sinon on vide la date
            $lastmod = "";
        }

        //On vérifie si la fréquence n'est pas vide
        if ($freq != "") {
            //Ce tableau contient toutes les options possibles pour la fréquence de changement de la page
            $change = array('always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never');
            //L'argument $freq dois faire partie de ce tableau sinon on le vide.
            $freq = in_array($freq, $change) ? $freq : "";
        }


        //On vérifie si la priorité n'est pas vide
        if ($prio != "") {
            //on vérifie si la priorité est numérique ou pas comprise entre 0 et 1
            if (!is_numeric($prio) OR $prio < 0 OR $prio > 1) {
                $prio = "";
            }
        }

        //On a tout vérifié, on ajoute une ligne dans notre tableau d'urls
        $this->_urls[] = array('loc' => $url, 'mod' => $lastmod, 'freq' => $freq, 'prio' => $prio);
    }

    //Il nous reste plus qu'à créer et enregistrer les fichiers
    public function generate() {
        //On parcourt les urls enregistrées
        foreach ($this->_urls as $v) {
            //on va utiliser un modulo "%" si le résultat est de 0 il faut créer un nouveau fichier
            if ($this->_totalUrls % $this->_maxUrlsPerFile == 0) {
                //Si on est déjà en train d'écrire dans un fichier, on ferme le dernier élément
                if ($this->_file) {
                    $this->_xml->endElement();
                    //On complète le fichier puis on le ferme
                    fwrite($this->_file, $this->_xml->flush());
                    fclose($this->_file);
                }
                //On crée un nouveau fichier
                $this->_newSitemapFile();
            }

            //On commence une nouvel url
            $this->_xml->startElement("url");
            //On écrit l'url
            $this->_xml->writeElement("loc", $this->_rootUrl . $v["loc"]);

            //Si on a une date de modification, on l'ajoute
            if (!empty($v["mod"]))
                $this->_xml->writeElement("lastmod", $v["mod"]);

            //Si on a une fréquence de modification, on l'ajoute
            if (!empty($v["freq"]))
                $this->_xml->writeElement("changefreq", $v["freq"]);

            //Et enfin si on a une priorité, on l'ajoute
            if (!empty($v["prio"]))
                $this->_xml->writeElement("priority", $v["prio"]);

            //On ferme l'élement url
            $this->_xml->endElement();
            //Pour ne pas saturer la mémoire du serveur on écrit déjà ça dans le fichier
            fwrite($this->_file, $this->_xml->flush());
            //Puis on la comptabilise
            $this->_totalUrls++;

            //fin du foreach
        }
        //Comme au-dessus, on ferme le dernier élément
        $this->_xml->endElement();
        //On complète le fichier puis on le ferme
        fwrite($this->_file, $this->_xml->flush());
        fclose($this->_file);
    }

}

$mapsgen = new SitemapGenerator("http://www.aquarium-anzin.fr");
//De base les sitemaps s'enregistrent à la racine du site, je préfère les mettre dans un répertoire.
//Donc je configure le chemin du répertoire
$mapsgen -> setSavePath("");

//La page d'accueil, premier paramètre vide pour l'url, pas de date de modification, 
//elle change tout le temps et elle est très importante
$mapsgen -> addUrl("", "", "always", "1.0");
//La page de contact, on donne l'url complète, pas de date, elle ne change jamais et n'est que moyennement importante
$mapsgen -> addUrl("nos-poissons.html", "", "yearly", "0.5");
$mapsgen -> addUrl("poisson-eau-mer.html", "", "monthly", "0.6");
$mapsgen -> addUrl("poisson-eau-douce.html", "", "monthly", "0.6");
$mapsgen -> addUrl("poisson-eau-froide.html", "", "monthly", "0.6");
$mapsgen -> addUrl("promotion-poisson.html", "", "weekly", "0.6");
$mapsgen -> addUrl("aquarium-aquariophilie.html", "", "monthly", "0.6");
$mapsgen -> addUrl("materiel-aquariophilie.html", "", "monthly", "0.6");
$mapsgen -> addUrl("plante-aquariophilie.html", "", "monthly", "0.6");
$mapsgen -> addUrl("marque-aquariophilie.html", "", "yearly", "0.4");
$mapsgen -> addUrl("info-pratique.html", "", "yearly", "0.4");
$mapsgen -> addUrl("service-aquariophilie.html", "", "yearly", "0.4");
$mapsgen -> addUrl("contact-aquarium-anzin.html", "", "never", "0.4");
$mapsgen -> addUrl("mentions-legales.php", "", "never", "0.4");

//les fiches poissons
$sql = @mysql_query('SELECT `idpoisson`,`titre` FROM `poisson` WHERE `idtype`<>5 ORDER BY `idpoisson`');
while ($data = mysql_fetch_assoc($sql)) {    
    $mapsgen -> addUrl('fiche-poisson-' . caractereValideUrl($data['titre']) . '-' . $data['idpoisson'] . '.html', "", "yearly", "0.8");    
}

//les fiches aqua
$sql = @mysql_query('SELECT `idaquarium`,`titre` FROM `aquarium` ORDER BY `idaquarium`');
while ($data = mysql_fetch_assoc($sql)) {    
    $mapsgen -> addUrl('fiche-aquarium-' . caractereValideUrl($data['titre']) . '-' . $data['idaquarium'] . '.html', "", "yearly", "0.6");    
}

//les fiches matériel
$sql = @mysql_query('SELECT `idmateriel`,`titre` FROM `materiel` ORDER BY `idmateriel`');
while ($data = mysql_fetch_assoc($sql)) {    
    $mapsgen -> addUrl('fiche-materiel-' . caractereValideUrl($data['titre']) . '-' . $data['idmateriel'] . '.html', "", "yearly", "0.6");    
}

//les fiches plantes
$sql = @mysql_query('SELECT `idplante`,`titre` FROM `plante` ORDER BY `idplante`');
while ($data = mysql_fetch_assoc($sql)) {    
    $mapsgen -> addUrl('fiche-plante-' . caractereValideUrl($data['titre']) . '-' . $data['idplante'] . '.html', "", "yearly", "0.6");    
}
$mapsgen -> generate();
?>